/**
 * *********************** ******* ***********************************
 *
 *  
 * 
 *  
 * *******************************************************************
 */

package com.arges.web.domain.tableutil;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.apache.ws.security.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import com.arges.web.common.Constant;

/**
 * 用于处理字符串
 * 
 * 
 * @version Ver 3.0
 * @since Ver 3.0
 * @Date 2012-9-15
 *
 */
public class EnhancedStringUtils
{

	private static Logger logger = LoggerFactory.getLogger(EnhancedStringUtils.class);

	/**
	 * 
	 * 将多个字符串拼接起来, 并以某种符号 作为 分隔符, 如 将 {"abc", "123"} 拼成 "abc, 123"
	 *
	 * @param seperator 分隔符, 如果为 null或"" 则没分隔符
	 * @param strs
	 * @since Ver 3.0
	 */
	public static String makeUp(String seperator, String... strs)
	{
		return makeUp(seperator, Arrays.asList(strs));
	}

	/**
	 * 
	 * 将多个字符串拼接起来, 并以某种符号 作为 分隔符, 如 将 {"abc", "123"} 拼成 "abc, 123"
	 *
	 * @param seperator 分隔符, 如果为 null或"" 则没分隔符
	 * @param strs
	 * @since Ver 3.0
	 */
	@SuppressWarnings("unchecked")
	public static String makeUp(String seperator, Collection strs)
	{
		StringBuilder sBuilder = new StringBuilder();

		boolean isFirstStr = true;
		for (Object str : strs)
		{
			if (!isFirstStr)
			{
				if (StringUtils.hasText(seperator))
				{
					sBuilder.append(seperator);
				}
			}
			else
			{
				isFirstStr = false;
			}
			sBuilder.append(str);
		}

		return sBuilder.toString();
	}

	/**
	 * TODO 重新描述注释，同时重命名 导入指定条数换行
	 *
	 * @param seperator
	 * @param strs
	 * @param seperator2 换行符号
	 * @param brNum
	 * @return
	 * @since Ver 3.0
	 */
	@SuppressWarnings("unchecked")
	public static String makeUp(String seperator, Collection strs, String seperator2, int brNum)
	{
		StringBuilder sBuilder = new StringBuilder();
		int count = 0;
		boolean isFirstStr = true;
		for (Object str : strs)
		{
			if (!isFirstStr)
			{
				if (StringUtils.hasText(seperator))
				{
					sBuilder.append(seperator);
				}
				if (count == brNum)
				{
					sBuilder.append(seperator2);
					count = 0;
				}
			}
			else
			{
				isFirstStr = false;
			}
			sBuilder.append(str);
			count++;
		}

		return sBuilder.toString();
	}

	/**
	 * 
	 * 将多个对象的属性拼接起来, 并以某种符号 作为 分隔符, 如 将 {"abc", "123"} 拼成 "abc, 123"
	 *
	 * @param seperator 分隔符, 如果为 null或"" 则没分隔符
	 * @param objs
	 * @param attrName 属性名，必须有相应的get或is方法
	 * @param clazz 对象的类
	 * @since Ver 3.0
	 */
	@SuppressWarnings("unchecked")
	public static String makeUp(String seperator, Collection objs, String attrName, Class clazz)
	{
		List<String> attrValueList = ListUtils.toAttrValueList(objs, attrName, clazz, String.class);
		return makeUp(seperator, attrValueList);
	}

	/**
	 * 
	 * 将多个对象拼成 in 条件 的内容 如 将 "1,d,e" 拼成 "'1','d','e'"
	 *
	 * @param strs
	 * @return
	 * @since Ver 3.0
	 */
	public static String makeUpInCondition(String value)
	{
		StringBuilder inCondition = new StringBuilder();

		String[] strs = value.split(",");
		for (int i = 0; i < strs.length; i++)
		{
			if (i != 0)
			{
				inCondition.append(",");
			}
			inCondition.append("'").append(strs[i]).append("'");
		}

		return inCondition.toString();
	}

	/**
	 * 
	 * 将用逗号分隔的字符串转换为具有特定类型的List, 如str = "1, 2, 3", type = Integer.class, 则生成的list内有 1, 2, 3 三项,且值为Integer类型 注意：使用该方法
	 * 也能转化为任意类，但该类必须有一个以String为参数的构造方法
	 *
	 * @param str 逗号分隔的字符串，如 "a,b,c"
	 * @param type 转化的类型
	 * @return
	 * @since Ver 3.0
	 */
	@SuppressWarnings("unchecked")
	public static List<?> toListForCommarSeperatedStr(String str, Class<?> type)
	{
		final String SEPERATOR = ",";
		String[] values = str.split(SEPERATOR);

		List list = new ArrayList();
		try
		{
			Constructor con = type.getConstructor(String.class);
			for (String value : values)
			{
				list.add(con.newInstance(value.trim()));
			}
		}
		catch (Exception e)
		{
		}

		return list;
	}

	/**
	 * 
	 * 用base64进行解码
	 *
	 * @param str
	 * @return
	 * @since Ver 3.0
	 */
	public static String decodeByBase64(String str)
	{
		String result = null;
		try
		{

			byte[] codes = Base64.decode(str.replace(" ", "+"));
			result = new String(codes, "utf-8");
		}
		catch (Exception e)
		{
			logger.error("error", e);
		}
		return result;
	}

	/**
	 * 
	 * 删除系统不支持的特殊字符，即页面上无法输入的字符
	 *
	 * @param str
	 * @return
	 * @since Ver 3.0
	 */
	public static String deleteUnsupportedChar(String str)
	{
		String result = null;
		if (str != null)
		{
			result = str.replaceAll(Constant.REGULAR_EXPRESSION_INVALID_CHAR, "");
		}
		return result;
	}

	public static Double toDouble(String value)
	{
		Double result = null;
		if (StringUtils.hasLength(value))
		{
			result = Double.parseDouble(value);
		}

		return result;
	}

	public static Long toLong(String value)
	{
		Long result = null;
		if (StringUtils.hasLength(value))
		{
			result = Long.parseLong(value);
		}

		return result;
	}
}
